iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
佛心分享-我的私藏工具箱

開發環境設定指南及工具分享系列 第 23

Day23-幫docker container加上自動重啟功能

  • 分享至 

  • xImage
  •  

今天當我們架了各式各樣的服務,但只要是服務就有機會會壞掉,這時候就會需要有health check以及auto heal的功能來檢查以及復原壞掉的服務,在這邊介紹他的運作機制以及部分限制,如果有需要這項服務的就可以自己加上去

以下是等等做實驗的範例docker-compose.yaml

services:
  docker-autoheal:
    image: willfarrell/autoheal:latest
    container_name: docker-autoheal
    restart: always
    environment:
      AUTOHEAL_CONTAINER_LABEL: all
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  learn-devops-backend:
    image: ghcr.io/kevinyay945/learn-devops-backend:v0.0.11
    container_name: learn-devops-backend
    restart: unless-stopped
    ports:
      - "5000:5000"
    labels:
      autoheal: "true"
    healthcheck:
      test: ["CMD-SHELL", "/backend health || exit 1"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 30s

在上述的實驗中我放了兩個service

docker-autoheal

這個服務會去查看labels有放上 autoheal=true的container的服務狀態,當他看到是unhealth時,就會自動將container重新啟動

learn-devops-backend

learn-devops-backend 中,他有提供兩個endpoint
[POST] /health/liveness/toggle
[GET] /health/liveness

第一個他可以自由的切換liveness的狀態,第二個可以用來判斷服務是否還活著

health check

而我們要讓服務可以順利切換health跟unhealth,就需要使用docker提供的health check的功能,文件如下

https://docs.docker.com/reference/dockerfile/#healthcheck

而這個服務會在service啟動後,透過定期去執行你所定義的的指令,判斷這個指令是否執行成功(回傳的狀態碼是否為0),如果超過重試的次數,就會將狀態切換成unhealth

而這個功能要注意一個點,因為他運行的環境就是你實際服務的container,所以如果你的container裡面沒有先安裝好一些工具(例如curl),就要換個測試health check的方法,我這邊是直接多設計一個啟動的command,讓他可以去打我提供的health check的http endpoint

實驗步驟

  1. 先設定好docker-compose.yaml
  2. 啟動他 docker compose up -d
  3. 查看container狀態 docker ps
  4. 檢查到服務為health後,切換狀態
curl -X 'POST' 'http://localhost:5000/health/liveness/toggle' -H 'accept: application/json'
  1. 等待1分半,此時可以觀察container的logs以及docker ps的狀態
  2. 當服務無回應時,就會在log中看到重啟的內容

上述實驗做完,可以試著將authheal的服務關掉,再讓原本的backend死掉,看看會不會有重啟的狀況發生


上一篇
Day22-設定第一個自架服務
下一篇
Day24-好用的自架服務-1
系列文
開發環境設定指南及工具分享25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言